!function() {
    function s(r, o) {
        var f;
        o < r && (f = r, r = o, o = f), f = o, f *= o, f += o, f >>= 1, Q[f += r] = 1;
    }
    function l(r, o) {
        var f;
        for (N[r + C * o] = 1, f = -2; f < 2; f++) N[r + f + C * (o - 2)] = 1, N[r - 2 + C * (o + f + 1)] = 1, 
        N[r + 2 + C * (o + f)] = 1, N[r + f + 1 + C * (o + 2)] = 1;
        for (f = 0; f < 2; f++) s(r - 1, o + f), s(r + 1, o - f), s(r - f, o - 1), s(r + f, o + 1);
    }
    function u(r) {
        for (;255 <= r; ) r = ((r -= 255) >> 8) + (255 & r);
        return r;
    }
    function v(r, o, f, e) {
        var t, a, n;
        for (t = 0; t < e; t++) x[f + t] = 0;
        for (t = 0; t < o; t++) {
            if (255 != (n = y[x[r + t] ^ x[f]])) for (a = 1; a < e; a++) x[f + a - 1] = x[f + a] ^ _[u(n + B[e - a])]; else for (a = f; a < f + e; a++) x[a] = x[a + 1];
            x[f + e - 1] = 255 == n ? 0 : _[u(n + B[0])];
        }
    }
    function h(r, o) {
        var f;
        return o < r && (f = r, r = o, o = f), f = o, f += o * o, f >>= 1, Q[f += r];
    }
    function d(r) {
        var o, f, e, t;
        switch (r) {
          case 0:
            for (f = 0; f < C; f++) for (o = 0; o < C; o++) o + f & 1 || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 1:
            for (f = 0; f < C; f++) for (o = 0; o < C; o++) 1 & f || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 2:
            for (f = 0; f < C; f++) for (o = e = 0; o < C; o++, e++) 3 == e && (e = 0), e || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 3:
            for (f = t = 0; f < C; f++, t++) for (3 == t && (t = 0), e = t, o = 0; o < C; o++, 
            e++) 3 == e && (e = 0), e || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 4:
            for (f = 0; f < C; f++) for (t = f >> 1 & 1, o = e = 0; o < C; o++, e++) 3 == e && (e = 0, 
            t = !t), t || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 5:
            for (f = t = 0; f < C; f++, t++) for (3 == t && (t = 0), o = e = 0; o < C; o++, 
            e++) 3 == e && (e = 0), (o & f & 1) + !(!e | !t) || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 6:
            for (f = t = 0; f < C; f++, t++) for (3 == t && (t = 0), o = e = 0; o < C; o++, 
            e++) 3 == e && (e = 0), (o & f & 1) + (e && e == t) & 1 || h(o, f) || (N[o + f * C] ^= 1);
            break;

          case 7:
            for (f = t = 0; f < C; f++, t++) for (3 == t && (t = 0), o = e = 0; o < C; o++, 
            e++) 3 == e && (e = 0), (e && e == t) + (o + f & 1) & 1 || h(o, f) || (N[o + f * C] ^= 1);
        }
    }
    function g(r) {
        var o, f = 0;
        for (o = 0; o <= r; o++) 5 <= j[o] && (f += e + j[o] - 5);
        for (o = 3; o < r - 1; o += 2) j[o - 2] == j[o + 2] && j[o + 2] == j[o - 1] && j[o - 1] == j[o + 1] && 3 * j[o - 1] == j[o] && (0 == j[o - 3] || r < o + 3 || 3 * j[o - 3] >= 4 * j[o] || 3 * j[o + 3] >= 4 * j[o]) && (f += t);
        return f;
    }
    function b() {
        var r, o, f, e, t, a = 0, n = 0;
        for (o = 0; o < C - 1; o++) for (r = 0; r < C - 1; r++) (N[r + C * o] && N[r + 1 + C * o] && N[r + C * (o + 1)] && N[r + 1 + C * (o + 1)] || !(N[r + C * o] || N[r + 1 + C * o] || N[r + C * (o + 1)] || N[r + 1 + C * (o + 1)])) && (a += D);
        for (o = 0; o < C; o++) {
            for (f = e = r = j[0] = 0; r < C; r++) (t = N[r + C * o]) == e ? j[f]++ : j[++f] = 1, 
            n += (e = t) ? 1 : -1;
            a += g(f);
        }
        n < 0 && (n = -n);
        var i = n, c = 0;
        for (i += i << 2, i <<= 1; C * C < i; ) i -= C * C, c++;
        for (a += c * E, r = 0; r < C; r++) {
            for (f = e = o = j[0] = 0; o < C; o++) (t = N[r + C * o]) == e ? j[f]++ : j[++f] = 1, 
            e = t;
            a += g(f);
        }
        return a;
    }
    var k, C, m, S, w, z, F = [ 0, 11, 15, 19, 23, 27, 31, 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24, 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28 ], p = [ 3220, 1468, 2713, 1235, 3062, 1890, 2119, 1549, 2344, 2936, 1117, 2583, 1330, 2470, 1667, 2249, 2028, 3780, 481, 4011, 142, 3098, 831, 3445, 592, 2517, 1776, 2234, 1951, 2827, 1070, 2660, 1345, 3177 ], A = [ 30660, 29427, 32170, 30877, 26159, 25368, 27713, 26998, 21522, 20773, 24188, 23371, 17913, 16590, 20375, 19104, 13663, 12392, 16177, 14854, 9396, 8579, 11994, 11245, 5769, 5054, 7399, 6608, 1890, 597, 3340, 2107 ], R = [ 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17, 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28, 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22, 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16, 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22, 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28, 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26, 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26, 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24, 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28, 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24, 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28, 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22, 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24, 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24, 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30, 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28, 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28, 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26, 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28, 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30, 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24, 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30, 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30, 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30, 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30, 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30, 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30, 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30, 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30, 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30, 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30, 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30, 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30, 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30, 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30, 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30, 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30, 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30, 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30 ], y = [ 255, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 ], _ = [ 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 0 ], x = [], M = [], N = [], Q = [], j = [], q = 2, B = [], e = 3, D = 3, t = 40, E = 10, o = null, r = {
        get ecclevel() {
            return q;
        },
        set ecclevel(r) {
            q = r;
        },
        get size() {
            return _size;
        },
        set size(r) {
            _size = r;
        },
        get canvas() {
            return o;
        },
        set canvas(r) {
            o = r;
        },
        getFrame: function(r) {
            return function(r) {
                var o, f, e, t, a, n, i, c;
                t = r.length, k = 0;
                do {
                    if (e = 4 * (q - 1) + 16 * (++k - 1), m = R[e++], S = R[e++], w = R[e++], z = R[e], 
                    t <= (e = w * (m + S) + S - 3 + (k <= 9))) break;
                } while (k < 40);
                for (C = 17 + 4 * k, a = w + (w + z) * (m + S) + S, t = 0; t < a; t++) M[t] = 0;
                for (x = r.slice(0), t = 0; t < C * C; t++) N[t] = 0;
                for (t = 0; t < (C * (C + 1) + 1) / 2; t++) Q[t] = 0;
                for (t = 0; t < 3; t++) {
                    for (f = e = 0, 1 == t && (e = C - 7), 2 == t && (f = C - 7), N[f + 3 + C * (e + 3)] = 1, 
                    o = 0; o < 6; o++) N[f + o + C * e] = 1, N[f + C * (e + o + 1)] = 1, N[f + 6 + C * (e + o)] = 1, 
                    N[f + o + 1 + C * (e + 6)] = 1;
                    for (o = 1; o < 5; o++) s(f + o, e + 1), s(f + 1, e + o + 1), s(f + 5, e + o), s(f + o + 1, e + 5);
                    for (o = 2; o < 4; o++) N[f + o + C * (e + 2)] = 1, N[f + 2 + C * (e + o + 1)] = 1, 
                    N[f + 4 + C * (e + o)] = 1, N[f + o + 1 + C * (e + 4)] = 1;
                }
                if (1 < k) for (t = F[k], f = C - 7; ;) {
                    for (o = C - 7; t - 3 < o && (l(o, f), !(o < t)); ) o -= t;
                    if (f <= t + 9) break;
                    l(6, f -= t), l(f, 6);
                }
                for (N[8 + C * (C - 8)] = 1, f = 0; f < 7; f++) s(7, f), s(C - 8, f), s(7, f + C - 7);
                for (o = 0; o < 8; o++) s(o, 7), s(o + C - 8, 7), s(o, C - 8);
                for (o = 0; o < 9; o++) s(o, 8);
                for (o = 0; o < 8; o++) s(o + C - 8, 8), s(8, o);
                for (f = 0; f < 7; f++) s(8, f + C - 7);
                for (o = 0; o < C - 14; o++) 1 & o ? (s(8 + o, 6), s(6, 8 + o)) : (N[8 + o + 6 * C] = 1, 
                N[6 + C * (8 + o)] = 1);
                if (6 < k) for (t = p[k - 7], e = 17, o = 0; o < 6; o++) for (f = 0; f < 3; f++, 
                e--) 1 & (11 < e ? k >> e - 12 : t >> e) ? (N[5 - o + C * (2 - f + C - 11)] = 1, 
                N[2 - f + C - 11 + C * (5 - o)] = 1) : (s(5 - o, 2 - f + C - 11), s(2 - f + C - 11, 5 - o));
                for (f = 0; f < C; f++) for (o = 0; o <= f; o++) N[o + C * f] && s(o, f);
                for (a = x.length, n = 0; n < a; n++) M[n] = x.charCodeAt(n);
                if (x = M.slice(0), (o = w * (m + S) + S) - 2 <= a && (a = o - 2, 9 < k && a--), 
                n = a, 9 < k) {
                    for (x[n + 2] = 0, x[n + 3] = 0; n--; ) t = x[n], x[n + 3] |= 255 & t << 4, x[n + 2] = t >> 4;
                    x[2] |= 255 & a << 4, x[1] = a >> 4, x[0] = 64 | a >> 12;
                } else {
                    for (x[n + 1] = 0, x[n + 2] = 0; n--; ) t = x[n], x[n + 2] |= 255 & t << 4, x[n + 1] = t >> 4;
                    x[1] |= 255 & a << 4, x[0] = 64 | a >> 4;
                }
                for (n = a + 3 - (k < 10); n < o; ) x[n++] = 236, x[n++] = 17;
                for (B[0] = 1, n = 0; n < z; n++) {
                    for (B[n + 1] = 1, i = n; 0 < i; i--) B[i] = B[i] ? B[i - 1] ^ _[u(y[B[i]] + n)] : B[i - 1];
                    B[0] = _[u(y[B[0]] + n)];
                }
                for (n = 0; n <= z; n++) B[n] = y[B[n]];
                for (e = o, n = f = 0; n < m; n++) v(f, w, e, z), f += w, e += z;
                for (n = 0; n < S; n++) v(f, w + 1, e, z), f += w + 1, e += z;
                for (n = f = 0; n < w; n++) {
                    for (i = 0; i < m; i++) M[f++] = x[n + i * w];
                    for (i = 0; i < S; i++) M[f++] = x[m * w + n + i * (w + 1)];
                }
                for (i = 0; i < S; i++) M[f++] = x[m * w + n + i * (w + 1)];
                for (n = 0; n < z; n++) for (i = 0; i < m + S; i++) M[f++] = x[o + n + i * z];
                for (x = M, o = f = C - 1, e = a = 1, c = (w + z) * (m + S) + S, n = 0; n < c; n++) for (t = x[n], 
                i = 0; i < 8; i++, t <<= 1) for (128 & t && (N[o + C * f] = 1); a ? o-- : (o++, 
                e ? 0 != f ? f-- : (e = !e, 6 == (o -= 2) && (o--, f = 9)) : f != C - 1 ? f++ : (e = !e, 
                6 == (o -= 2) && (o--, f -= 8))), a = !a, h(o, f); ) ;
                for (x = N.slice(0), f = 3e4, e = t = 0; e < 8 && (d(e), (o = b()) < f && (f = o, 
                t = e), 7 != t); e++) N = x.slice(0);
                for (t != e && d(t), f = A[t + (q - 1 << 3)], e = 0; e < 8; e++, f >>= 1) 1 & f && (N[C - 1 - e + 8 * C] = 1, 
                e < 6 ? N[8 + C * e] = 1 : N[8 + C * (e + 1)] = 1);
                for (e = 0; e < 7; e++, f >>= 1) 1 & f && (N[8 + C * (C - 7 + e)] = 1, e ? N[6 - e + 8 * C] = 1 : N[7 + 8 * C] = 1);
                return N;
            }(r);
        },
        utf16to8: function(r) {
            var o, f, e, t;
            for (o = "", e = r.length, f = 0; f < e; f++) 1 <= (t = r.charCodeAt(f)) && t <= 127 ? o += r.charAt(f) : (2047 < t ? (o += String.fromCharCode(224 | t >> 12 & 15), 
            o += String.fromCharCode(128 | t >> 6 & 63)) : o += String.fromCharCode(192 | t >> 6 & 31), 
            o += String.fromCharCode(128 | t >> 0 & 63));
            return o;
        },
        draw: function(r, o, f, e, t, a, n, i, c, s) {
            if (q = s || q, o) {
                var l = Math.min(t, a);
                r = this.utf16to8(r);
                var u = this.getFrame(r), v = l / C;
                n && (o.setFillStyle(n), o.fillRect(f, e, t, t)), o.setFillStyle(i || "black");
                for (var h = 0; h < C; h++) for (var d = 0; d < C; d++) u[d * C + h] && o.fillRect(f + v * h, e + v * d, v, v);
            } else console.warn("No canvas provided to draw QR code in!");
        }
    };
    module.exports = {
        api: r
    };
}();